package config

import (
	"time"

	"math/rand/v2"

	"gitee.com/liuyun-luo/MagicStreamMovies/Server/global"
	"github.com/go-redis/redis"
)

// 普通访问的键，在Redis缓存的超时时间--比如：普通电影及其强相关内容
const defaultCacheExpirationTime = time.Hour * 24 * 1 //1天

// 高频访问的键，在Redis缓存的超时时间--比如：热门电影及其强相关内容
const highFrequentCacheExpirationTime = time.Hour * 24 * 7 //7天

// 缓存时间的随机扰动值
func cacheRandomTime() time.Duration {
	return time.Duration(rand.IntN(300)) * time.Minute //300分钟内随机扰动
}

// 获取普通访问的键的超时时间
func GetDefaultCacheExpirationTime() time.Duration {
	return defaultCacheExpirationTime + cacheRandomTime()
}

// 获取高频访问的键的超时时间
func GetHighFrequentCacheExpirationTime() time.Duration {
	return highFrequentCacheExpirationTime + cacheRandomTime()
}

// 电影在Redis中的key
const MovieKeyName = "movie" //后接电影:id

// 电影的点赞数在Redis中的key
const MovieLikeCountKeyName = "like_count" //前接电影:id

// 电影的点赞数在Redis中的key
const MoviePlayCountKeyName = "play_count" //前接电影:id

// 电影评论在Redis中的key
const MovieReviewKeyName = "movie_review" //前接电影:id，后可接点赞

// 电影评论的点赞数在Redis中的key
const MovieReviewLikeCountKeyName = "like_count" //前接MovieReviewKeyName

// 电影点赞造成脏数据的键名
const MoviesLikeDirtySetKeyName = "movie:like_count:dirty_set"

// 电影热度排名的ZSet的键名
const MoviesPopularityZSetKeyName = "movie:popularity_zset"

// 给电影搜索引擎发送消息的消息队列的键名
const MovieSearchListKeyName = "movie:search_list"

// 用户在Redis中的key
const UserKeyName = "user" //后接用户:id

func initRedis() {
	//创建redis客户端
	RedisClient := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		DB:       0,
		Password: "",
	})

	//连接redis服务器
	if _, err := RedisClient.Ping().Result(); err != nil {
		panic("redis服务器连接失败,err: " + err.Error())
	}
	//保存redis客户端到全局变量
	global.RedisDB = RedisClient
}
